#include"util.hpp"
#include<cstdio>
#include<vector>
#include<functional>

using func_t = std::function<void()>;

#define INIT(v) do{\
        (v).push_back(printfLog);\
        (v).push_back(download);\
        (v).push_back(executeSql);\
    }while(0)

#define EXEC_OTHER(cbs) do{\
        for(auto const &cb:(cbs))(cb)();\
    }while(0)

int main()
{
    char buffer[1024];
    while(true)
    {
        printf(">>:");
        fflush(stdout);
        //默认的读取方式都是阻塞式的
        setNoBlock(0);
        ssize_t s = read(0,buffer,sizeof(buffer)-1);
        if(s>0)
        {
            buffer[s-1] = '\0';
            std::cout<<"echo#"<<buffer<<std::endl;
        }
        else if(s == 0)//表示文件读到结尾
        {
            std::cout<<"read end"<<std::endl;
            break;
        }
        else   
        {
            //1，当我不输入的时候，底层没有数据，算错误吗？不算错误，只不过以错误的形式返回了
            //2，我又如何区分，真的错了，还是底层没有数据？单纯返回值，无法区分！
            // std::cout <<"EAGAIN:"<< EAGAIN <<" EWOULDBLOCK:"<< EWOULDBLOCK << std::endl;
            if(errno == EAGAIN)
            {
                std::cout<<"没有出错，只是没数据\n我还可以做其他的事情"<<std::endl;
                std::vector<func_t> cbs;
                INIT(cbs);
                EXEC_OTHER(cbs);
                sleep(1);
            }
            else if(errno == EINTR)//没有出错，只是被信号中断了
            {
                continue;
            }
            else
            {
                std::cout << "s : " << s << "errno:"<< strerror(errno)<< std::endl;//这时才是真的出错了
                break;
            }
        }


    }
    return 0;
}